package cn.thr.ymcc.web.controller;

import cn.thr.ymcc.domain.dto.ApplyDto;
import cn.thr.ymcc.query.PayOrderQuery;
import cn.thr.ymcc.result.JsonResult;
import cn.thr.ymcc.result.PageList;
import cn.thr.ymcc.service.IPayOrderService;
import cn.thr.ymcc.domain.PayOrder;
import com.alipay.easysdk.factory.Factory;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.checkerframework.checker.units.qual.K;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/payOrder")
public class PayOrderController {

    @Autowired
    public IPayOrderService payOrderService;

    /**
     * 异步通知接口
     * 是由支付宝开发平台采用Java 程序发送http请求来访问
     * 支付宝开放平台异步处理后， 将处理接口告诉我们系统
     *   1）二次验签：校验参数数据是否被修改
     *   2）完成后续业务分析
     *         修改支付单状态
     *         添加支付流水记录
     *         修改订单状态
     *         添加用户购买课程的记录
     * @return
     */
    @PostMapping("/asyncNotify")
    public String  asyncNotify (HttpServletRequest request){
        try {
            System.out.println("异步通知接口已被调用");
             //获取请求参数
            Map<String, String[]> parameterMap = request.getParameterMap();
            //需要将请求参数里面的值（数组）取出数组中的一个值
            Map<String,String> parameters = parameterMap.entrySet()
                    .stream()
                    .collect(Collectors.toMap(k-> k.getKey(),v->v.getValue()[0]));
            //发送请求到支付宝进行二次验签
            Boolean aBoolean = Factory.Payment.Common().verifyNotify(parameters);
            System.out.println("二次验签结果：" + aBoolean);
            //如果第二次验签是true
            if(aBoolean){
                /**
                 * 完成后续业务
                 * 1)修改支付单状态为已支付  --支付服务中
                 * 2）添加支付流水记录       --支付服务中
                 * 3）修改订单状态为已支付     --订单服务
                 * 4）添加用户购买课程的记录    --课程服务
                 * 第一二个操作都在当前支付服务中，可以直接操作，比较方便
                 * 第二三个操作在订单服务中国，第四操作在课程服务中，这个需要涉及到跨数据库操作（分布式事务）
                 *  1）可以使用openfeign 调用订单服务和课程服务的接口
                 *  2）可以使用MQ 发消息（最终一致性），在订单服务和课程服务中分别写消费者
                 */

                //取出状态
                String trade_status = parameters.get("trade_status");
                //如果状态码是成功 执行后续业务
                if ("TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status)){
                    payOrderService.paySuccess(parameters);
                }else {
                    System.out.println("支付交易失败");
                }

                return "success";
            }else {
                return "failure";
            }


        } catch (Exception e) {
            e.printStackTrace();
            return "failure";
        }
    }
    /**
     * 申请支付
     * @param applyDto
     * @return
     */
    @PostMapping("/apply")
    public JsonResult apply(@RequestBody ApplyDto applyDto){
        return JsonResult.me(payOrderService.apply(applyDto));
    }

    /**
     * 前端轮询
     * @param orderNo
     * @return
     */
   @GetMapping("/checkPayOrder/{orderNo}")
   public JsonResult checkPayOrder(@PathVariable("orderNo") String orderNo){
        return JsonResult.me(payOrderService.getOne(new QueryWrapper<PayOrder>().eq("order_no",orderNo)));
   }

    /**
    * 保存和修改公用的
    */
    @PostMapping("/save")
    public JsonResult saveOrUpdate(@RequestBody PayOrder payOrder){
        if(payOrder.getId()!=null){
            payOrderService.updateById(payOrder);
        }else{
            payOrderService.save(payOrder);
        }
        return JsonResult.me();
    }

    /**
    * 删除对象
    */
    @DeleteMapping("/{id}")
    public JsonResult delete(@PathVariable("id") Long id){
        payOrderService.removeById(id);
        return JsonResult.me();
    }

    /**
   * 获取对象
   */
    @GetMapping("/{id}")
    public JsonResult get(@PathVariable("id")Long id){
        return JsonResult.me().setData(payOrderService.getById(id));
    }


    /**
    * 查询所有对象
    */
    @GetMapping("/list")
    public JsonResult list(){
        return JsonResult.me().setData(payOrderService.list(null));
    }


    /**
    * 带条件分页查询数据
    */
    @PostMapping("/pagelist")
    public JsonResult page(@RequestBody PayOrderQuery query){
        Page<PayOrder> page = new Page<PayOrder>(query.getPageNo(), query.getPageSize());
        page = payOrderService.page(page);
        return JsonResult.me().setData(new PageList<PayOrder>(page.getTotal(), page.getRecords()));
    }
}
